<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>1582. 二进制矩阵中的特殊位置</title>
  </head>
  <body>
    <script>
      //     给你一个大小为 rows x cols 的矩阵 mat，其中 mat[i][j] 是 0 或 1，请返回 矩阵 mat 中特殊位置的数目 。

      // 特殊位置 定义：如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0（行和列的下标均 从 0 开始 ），则位置 (i, j) 被称为特殊位置。

      //

      // 示例 1：

      // 输入：mat = [[1,0,0],
      //             [0,0,1],
      //             [1,0,0]]
      // 输出：1
      // 解释：(1,2) 是一个特殊位置，因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0
      // 示例 2：

      // 输入：mat = [[1,0,0],
      //             [0,1,0],
      //             [0,0,1]]
      // 输出：3
      // 解释：(0,0), (1,1) 和 (2,2) 都是特殊位置
      // 示例 3：

      // 输入：mat = [[0,0,0,1],
      //             [1,0,0,0],
      //             [0,1,1,0],
      //             [0,0,0,0]]
      // 输出：2
      // 示例 4：

      // 输入：mat = [[0,0,0,0,0],
      //             [1,0,0,0,0],
      //             [0,1,0,0,0],
      //             [0,0,1,0,0],
      //             [0,0,0,1,1]]
      // 输出：3

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/special-positions-in-a-binary-matrix
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
      /**
       * @param {number[][]} mat
       * @return {number}
       */
      var numSpecial = function (mat) {
        let res = 0
        let oneIndexMap = new Map()
        // debugger
        mat.forEach((obj, index) => {
          const arr = []
          obj.forEach((item, i) => {
            if (item === 1) {
              arr.push(i)
              oneIndexMap.set(index, arr)
            }
          })
        })
        console.log(oneIndexMap)
        let allArr = []
        for (let [key, val] of oneIndexMap) {
          if (val.length > 1) {
            allArr.push(...val)
            allArr.push(...val)
          } else {
            allArr.push(...val)
          }
        }
        console.log(allArr)
        debugger
        let countNum = new Map()
        allArr.forEach((item) => {
          if (!countNum.get(item)) {
            countNum.set(item, 1)
          } else {
            let n = countNum.get(item, 1)
            countNum.set(item, n + 1)
          }
        })
        for (let [key, val] of countNum) {
          if (val === 1) {
            res++
          }
        }
        return res
      }

      // var numSpecial = function (mat) {
      //   let count = 0
      //   for (let i = 0; i < mat.length; i++) {
      //     let index = mat[i].indexOf(1)
      //     if (index === -1 || index !== mat[i].lastIndexOf(1)) {
      //       continue
      //     }
      //     let isSpecial = true
      //     for (let j = 0; j < mat.length; j++) {
      //       if (i !== j && mat[j][index] === 1) {
      //         isSpecial = false
      //         break
      //       }
      //     }
      //     if (isSpecial) {
      //       count++
      //     }
      //   }
      //   return count
      // }

      console.log(
        numSpecial([
          [0, 0, 0, 1],
          [1, 0, 0, 0],
          [0, 1, 1, 0],
          [0, 0, 0, 0],
        ])
      )
    </script>
  </body>
</html>
